package mutacion;

import java.util.ArrayList;

import opciones.Opciones;

import utils.Arbol;
import utils.SRandom;
import cromosoma.CromosomaBloques;

public class MutacionArbol implements Mutacion {

	@Override
	public void mutacion(CromosomaBloques c, double probMutacion) {
		ArrayList<Arbol> preOrden=null;
		double numAle = SRandom.nextDouble();
		if (numAle < probMutacion)
		{
			preOrden = c.get_gen().preordenFuncion();
			
			if (preOrden.size() > 0) {
			
			//Elegimos al azar un nodo funcion del arbol
			int NodoEnganche = SRandom.nextInt(preOrden.size());
			
			Arbol elementoAMutar = preOrden.get(NodoEnganche);
			
			if (c.get_gen().getProfTotal() - elementoAMutar.getProfundidad() > 0)
			{
				
				Arbol padre = elementoAMutar.getPadre();
				
				//Generamos el nuevo Arbol.
				Arbol arbol = new Arbol(c.getcjtoFuns(),c.getcjtoTerms(),Opciones.PROF_MAX_INICIAL,0,null,false,true);
				arbol.calcularProfundidad();
			
				//ponemos como padre el antiguo padre.
				arbol.setPadre(elementoAMutar.getPadre());
				
				//Lo insertamos en el hijo izquierdo o derecho segun corresponda.
					//si el subarbol que voy a quitar era hijo izq de su padre entonces ahora su hijo izquierdo es arbol.
					//sino sera su hijo derecho.
				if (elementoAMutar.isEsHi()) padre.setHi(arbol);
				else padre.setHd(arbol);
				
				preOrden.set(NodoEnganche, arbol);
			}
			}
		}
	}

}
